package com.zt.questionnaire.model.excel.questionnaire;

import com.zt.questionnaire.common.enums.QuestionTypeEnum;
import com.zt.questionnaire.common.service.HReadExcelFather;
import com.zt.questionnaire.common.utils.NumberUtils;
import com.zt.questionnaire.common.utils.ObjectUtils;
import com.zt.questionnaire.common.utils.StringUtils;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * 问题表
 *
 * @author funnywus
 */
@Slf4j
@Data
public class QuestionnaireQuestionExcel {


    /**
     * 问题id
     **/
    private String id;

    /**
     * 问题标题
     */
    private String name;

    /**
     * 问题提示，标题下面的小字问题提示，标题下面的小字
     */
    private String tips;

    /**
     * 问题类型
     * choice: 单选
     * choice_multi: 多选(选项中有做标识)
     * fill: 单文本填空，必填
     * text: 字符串
     * number: 数字
     * digit: 小数
     * date:日期题
     * connect_page: 文件模块间承接内容（没有标题），数据跟普通问题一样填写，标题不填就行
     * 文本和图片以英文逗号隔开，并且图片以 / 开头
     * 格式: 文本,图片,文本,图片
     * 示例: 你好,/goods/a.jpg,/goods/b.jpg
     * scale: 量表题，（如完全不符合-完全符合，1-5选择）
     * fill_multi：多条填写题,选填
     */
    private String type;

    /**
     * 选项id列表
     */
    private String option_id_list;

    /**
     * 选项id列表
     */
    private List<String> optionIdList;

    /**
     * type=3的限制类型
     * text: 字符串
     * number: 数字
     * digit: 小数
     */
    private String limit_type;

    /**
     * type=3才有
     * 需要单独存入数据库的字段名
     * prefer_name 用户希望被称呼的昵称 （第1题答案）
     * age 年龄 （第3题答案）
     * gender 性别 （第2题答案）
     * height 身高 （第4题答案）
     * current_weight 体重 （第5题答案）
     * user_target_weight 用户目标
     */
    private String filed_name;

    /**
     * type=5才有
     * 左侧内容
     * <p>
     * 左侧 非常不符合
     * 右测 非常符合
     */
    private String left_content;

    /**
     * type=5才有
     * 右测内容
     * <p>
     * 左侧 非常不符合
     * 右测 非常符合
     */
    private String right_content;

    /**
     * 1: 需要
     * 0或不填: 不需要
     * <p>
     * 标题中是否需要上一道题的答案，如果为1，那么当前问题中%为占位符，客户端会替换上一道问题的答案。
     * 第三套问卷中有
     */
    private Integer is_prev_answer;

    /**
     * 做完题后，给的文字答案
     */
    private String answer;

    /**
     * 例子，跟在题目下面的
     */
    private String example;

    /**
     * 有多重样式的才需要填
     * 单选chioce：
     * 性别：gender
     * 单排大按钮（正常样式）：oneline_button
     * <p>
     * 多选choice_multi:
     * 单排大按钮:oneline_button
     * 双排大按钮:twoline_button
     * 圆形选择框:radio
     * 方型勾选框:checkbox
     * <p>
     * 填空fill:
     * 姓名:name
     * 横线（正常样式）:line
     */
    private String option_style;

    /**
     * 框后缀
     */
    private String suffix;

    /**
     * 框内提示
     */
    private String placeholder;

    public static Map<String, QuestionnaireQuestionExcel> load(String[] titleNames, String[][] values)
        throws Exception {
        boolean is = true;
        LinkedHashMap<String, QuestionnaireQuestionExcel> map = new LinkedHashMap<>();
        List<QuestionnaireQuestionExcel> list = HReadExcelFather.load(QuestionnaireQuestionExcel.class, titleNames, values);
        for (QuestionnaireQuestionExcel base : list) {
            String id2 = base.id;
            if (StringUtils.isBlank(id2)) {
                continue;
            }
            QuestionnaireQuestionExcel old = map.get(id2);
            if (old != null) {
                is = false;
                log.error("questionnaire表中question表中id重复，id=" + id2);
                continue;
            }
            String type1 = base.getType();
            if (StringUtils.isBlank(type1)) {
                is = false;
                log.error("questionnaire表中question表中type不能为空，id=" + id2);
                continue;
            }
            // 以下类型必须要有选项
            String option_id_list1 = base.getOption_id_list();
            if (
                QuestionTypeEnum.ONE.getCode().equals(type1) &&
                    QuestionTypeEnum.MORE.getCode().equals(type1) &&
                    QuestionTypeEnum.SCALE.getCode().equals(type1) &&
                    QuestionTypeEnum.MORE_OPTIONAL_WRITE.getCode().equals(type1) &&
                    StringUtils.isBlank(option_id_list1)
            ) {
                log.error("questionnaire表中question表中option_id_list不能为空，id=" + id2);
                continue;
            }

            if (StringUtils.isNotBlank(option_id_list1)) {
                // 处理选项id，例如：101-107,1c1,108-117,1c2,118-126， 101-107 中间的数据也需要
                List<String> optionIdList = NumberUtils.splitStringList(option_id_list1, ",");
                if (ObjectUtils.isNotEmpty(optionIdList)) {
                    List<String> newOptionIdList = new ArrayList<>();
                    for (String id : optionIdList) {
                        // 包含连续的问题id，例如：101-107
                        if (id.contains("-")) {
                            List<String> strList = NumberUtils.splitStringList(id, "-");
                            String startId = strList.get(0);
                            String endId = strList.get(1);
                            // 截取后2位数字，进行累加
                            String prefix = startId.substring(0, startId.length() - 3);
                            int startIdNum = Integer.parseInt(startId.substring(startId.length() - 3));
                            int endIdNum = Integer.parseInt(endId.substring(endId.length() - 3));
                            for (int i = startIdNum; i <= endIdNum; i++) {
                                newOptionIdList.add(prefix + StringUtils.leftPad((i) + "", 3, "0"));
                            }
                        } else {
                            newOptionIdList.add(id);
                        }
                    }
                    base.setOption_id_list(null);
                    base.setOptionIdList(newOptionIdList);
                }
            }

            map.put(base.getId(), base);
        }
        if (!is) {
            throw new Exception("excel表格读取错误");
        }
        return map;

    }
}
